package priv.dajie.tzzq.core;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import priv.dajie.tzzq.bot.Bot;
import priv.dajie.tzzq.bot.BotManager;
import priv.dajie.tzzq.bot.buff.BuffBot;
import priv.dajie.tzzq.bot.c5.C5Bot;
import priv.dajie.tzzq.bot.exception.DataException;
import priv.dajie.tzzq.bot.exception.SellException;
import priv.dajie.tzzq.bot.steam.SteamBot;

import priv.dajie.tzzq.model.SellType;
import priv.dajie.tzzq.spider.model.Platform;
import priv.dajie.tzzq.bot.model.*;
import priv.dajie.tzzq.model.SellGoodsState;
import priv.dajie.tzzq.model.SellStateItem;
import priv.dajie.tzzq.model.SellStateItems;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.*;


public class AutoSellToRMB {
//    private C5Bot c5Bot;
//    private BuffBot buffBot;
//    private SteamBot steamBot;
//    private SellStateTable sellStateTable;
//    private BigDecimal rate;
//    private Logger logger = LogManager.getLogger(this.getClass());
//
//    {
//        sellStateTable = SellStateTable.getInstance();
//        Properties properties = new Properties();
//        InputStream inputStream = null;
//        try{
//            inputStream = new FileInputStream(System.getProperty("user.dir")+ "/config/botinfo.properties");
//            properties.load(inputStream);
//            rate = new BigDecimal(properties.getProperty("steam-to-platform-rate"));
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        finally {
//            if (inputStream!=null){
//                try {
//                    inputStream.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//
//    public AutoSellToRMB() {
//        c5Bot = BotManager.getC5Bot();
//        buffBot = BotManager.getBuffBot();
//        steamBot = BotManager.getSteamBot();
//    }
//
//    public AutoSellToRMB(C5Bot c5Bot, BuffBot buffBot, SteamBot steamBot) {
//        this.c5Bot = c5Bot;
//        this.buffBot = buffBot;
//        this.steamBot = steamBot;
//    }
//
//    public void checkC5Sell(){
//        // 获取数据库的销售记录
//        SellStateItems sellStateItems = sellStateTable.getSellStateItem(SellGoodsState.SELLING, Platform.C5);
//        // 获取c5销售中的商品
//        List<C5SellingItem> c5SellingItems = c5Bot.getOnSellItems();
//        throw new RuntimeException("未完成");
//    }
//
//    public void searchHistory(){
//
//    }
//
//    public void checkSellPrice(Platform platform){
//        Bot bot;
//        switch (platform){
//            case C5:
//                bot = c5Bot;
//                break;
//            case BUFF:
//                bot = buffBot;
//                break;
//            default:
//                throw new DataException("仅支持buff与c5平台");
//        }
//        SellStateItems sellStateItems = sellStateTable.getSellStateItem(SellGoodsState.SELLING, platform);
//        SellingMap selfSellMap = bot.getSelfSell();
//        SellingMap onSellMap = bot.getOnSell();
//        // 用于记录状态未知的商品
//        List<SellStateItem> secrch = new ArrayList<>();
//        List<SellingItem> changePriceItems = new ArrayList<>();
//        for (SellStateItem sellStateItem : sellStateItems){
//            // 获取商品的销售状态
//            SellingItem sellingItem = sellStateItem.getSellType() == SellType.ON_SELL
//                    ?onSellMap.get(sellStateItem.getSellID())
//                    :selfSellMap.get(sellStateItem.getSellID());
//            // 商品不再销售中，则添加进在搜索列表
//            if(sellingItem == null) {
//                secrch.add(sellStateItem);
//            }
//            // 获取最低售价
//            BigDecimal minPrice = bot.getSellItemsBySteamName(sellStateItem.getSteamName()).get(0).getPrice();
//            BigDecimal sellPrice = sellingItem.getPrice();
//            if(sellPrice.compareTo(minPrice)>0){
//                BigDecimal newPrice = minPrice.subtract(new BigDecimal(0.01));
//                // 实际收益比大于限额-0.05则更改价格
//                if(newPrice.divide(sellStateItem .getBuyPrice()).compareTo(rate.subtract(new BigDecimal(0.05)))>=0){
//                    sellingItem.setPrice(newPrice);
//                    changePriceItems.add(sellingItem);
//                    logger.info(sellStateItem.getSteamName()+"需更改价格为："+newPrice);
//                }
//                else {
//                    logger.warn(sellStateItem.getSteamName()+"收益比过低，无法更改价格");
//                }
//            }
//            else{
//                logger.info(sellStateItem.getSteamName()+"无需更改价格");
//            }
//        }
//
//        // 判断是否有商品需要更改价格
//        if(changePriceItems.size() > 0) {
//            try {
//                // 更改价格
//                ChangePriceResults changePriceResults = bot.changePrice(changePriceItems);
//                // 判断是否更改成功，并更新数据库
//                for (SellingItem sellingItem : changePriceItems) {
//                    if (changePriceResults.get(sellingItem.getSellID())) {
//                        SellStateTable.getInstance().updateStateBySellID(sellingItem.getSellID(), sellingItem.getPrice());
//                        logger.info(sellingItem.getSellID() + "更改价格成功");
//                    } else {
//                        logger.error(sellingItem.getSellID() + "更改价格失败");
//                    }
//                }
//            } catch (SellException e) {
//                logger.error(e);
//            }
//        }
//    }
//
//    public void buffDeliver(){
//        List<SellingItem> sellingItems = buffBot.getNeedToDeliverItems();
//        while (buffBot.isTrading()){
//            try {
//                Thread.sleep(2000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//
//        // 每次对5个订单进行发货
//        for(int i=0;i<sellingItems.size();i+=5){
//            int max = Math.min(i+5, sellingItems.size());
//            // 对待发货商品列表进行切分
//            String[] tradeIDs = buffBot.deliver(new ArrayList<>(sellingItems.subList(i,max)));
//            for(String id : tradeIDs) {
//                System.out.println(steamBot.deliverTrade(id));
//            }
//
//
//        }
//    }
//
//
//    public BigDecimal getNewPrice(BigDecimal oldPrice, BigDecimal minPrice, BigDecimal buyPrice){
//        if(oldPrice.compareTo(minPrice)>0){
//            if(minPrice.subtract(new BigDecimal("0.01")).divide(buyPrice).compareTo(rate) > 0){
//                return minPrice.subtract(new BigDecimal("0.01"));
//            }
//            else if(minPrice.divide(buyPrice).compareTo(rate)>0) {
//                return minPrice;
//            }
//            else {
//                return oldPrice;
//            }
//        }
//        else {
//            return oldPrice;
//        }
//    }
//
//    public MaxPrice getMaxPrick(String steamName){
//        SellItem buffSellItem = buffBot.getSellItemsBySteamName(steamName).get(0);
//        SellItem c5SellItem = c5Bot.getSellItemsBySteamName(steamName).get(0);
//        MaxPrice maxPrice;
//        if(buffSellItem.getPrice().compareTo(c5SellItem.getPrice())>=0){
//            maxPrice = new MaxPrice(Platform.BUFF, buffSellItem.getPrice());
//        }
//        else {
//            maxPrice = new MaxPrice(Platform.C5, c5SellItem.getPrice());
//        }
//        return maxPrice;
//    }
//
//    private List<SellStateItem> takeToC5(List<SellStateItem> sellStateItems){
//        Map<String, C5SteamPackItem> c5SteamPackItemMap = c5Bot.getSteamPackItems().convertToMap();
//        List<C5SteamPackItem> take = new ArrayList<>();
//        List<SellStateItem> success = new ArrayList<>();
//        // 找出可移动到c5的商品
//        Map<C5SteamPackItem, SellStateItem> takeBackMap = new HashMap<>();
//        for(SellStateItem sellStateItem : sellStateItems){
//            C5SteamPackItem c5SteamPackItem=c5SteamPackItemMap.get(sellStateItem.getSteamName());
//            if(c5SteamPackItem == null){
//                logger.error(c5SteamPackItem.getSteamName()+"在c5获取的steam背包中找不到记录");
//            }
//            else{
//                take.add(c5SteamPackItem);
//                takeBackMap.put(c5SteamPackItem, sellStateItem);
//            }
//        }
//
//        // 每次转移5个商品 （该操作很容易出现bug）
//        for(int i=0;i<take.size();i+=5){
//            int max = Math.min(i+5, take.size());
//            while(c5Bot.isTrading()){
//                logger.info("等待c5完成交易");
//            }
//            List<C5SteamPackItem> temp = new ArrayList<>(take.subList(i, max));
//            // 分割取回列表，并提交取回请求
//            String trackerId = c5Bot.deposit(temp);
//            // 自动跟踪报价状态，获取交易单号
//            String[] tradeids = c5Bot.autoTracker(trackerId);
//            for(String id : tradeids) {
//                // steam接受交易请求
//                steamBot.deliverTrade(id);
//            }
//            // 分析报价是否完成，以确保商品已经存入c5背包
//            while (true){
//                TrackStateInfo trackStateInfo = c5Bot.tracker(trackerId);
//                // 取回成功则写入数据库 并跳出循环
//                if(trackStateInfo.getTrackState() == TrackState.SUCCESS){
//                    for(C5SteamPackItem c5SteamPackItem : temp) {
//                        SellStateItem sellStateItem = takeBackMap.get(c5SteamPackItem);
//                        // 在哈希表中找不到SellStateItem，如无意外该情况不会出现
//                        if (sellStateItem == null){
//                            logger.error("找不到出售状态："+sellStateItem);
//                            continue;
//                        }
//                        SellStateTable.getInstance().updateState(sellStateItem.getId(), SellGoodsState.C5_PACKAGE);
//                        success.add(sellStateItem);
//                    }
//                    logger.info(trackStateInfo.getId() + "报价完成");
//                    break;
//                }
//                // 取回失败则不进行改动 跳出循环
//                else if(trackStateInfo.getTrackState() != TrackState.SENDED){
//                    logger.error(trackStateInfo.getId() + "报价没有完成：" + trackStateInfo.getTrackState());
//                    break;
//                }
//            }
//        }
//        return success;
//    }
//
//    public void sellAll(){
//        // 从数据库获取冷却中的商品
//        SellStateItems sellStateItems = SellStateTable.getInstance().getSellStateItem(SellGoodsState.WAIT);
//        SteamPackItems steamPackItems = steamBot.getPack();
//        HashMap<String, SteamPackItem> steamPackMap = steamPackItems.getMap();
//        List<SellStateItem> buffSell = new ArrayList<>();
//        List<SellStateItem> c5Sell = new ArrayList<>();
//        for (SellStateItem sellStateItem : sellStateItems){
//            SteamPackItem steamPackItem = steamPackMap.get(sellStateItem.getSteamName());
//            // 判断是否已经冷却完毕
//            if (steamPackItem != null){
//                logger.info(steamPackItem.getSteamName() + "已冷却完毕！");
//                // 获取收益最高的平台
//                MaxPrice maxPrice = getMaxPrick(sellStateItem.getSteamName());
//                if (maxPrice.getPlatform() == Platform.BUFF){
//                    buffSell.add(sellStateItem);
//                }
//                else {
//                    c5Sell.add(sellStateItem);
//                }
//            }
//        }
//        // 把可出售的商品取回到c5
//        c5Sell = takeToC5(c5Sell);
//
//    }
//
//    private void buffSell(List<SellStateItem> sellStateItems){
//        BuffSteamPackItems buffSteamPackItems = buffBot.getBuffSteamPackItems();
//        HashMap<String, BuffSteamPackItem> packItemMap = buffSteamPackItems.getSteamNameMap();
//        for(SellStateItem sellStateItem : sellStateItems){
//            BuffSteamPackItem buffSteamPackItem = packItemMap.get(sellStateItem.getSteamName());
//            if (buffSteamPackItem == null){
//                logger.error("buff-steam背包找不到商品:"+sellStateItem.getSteamName());
//                continue;
//            }
//            SellItem sellItem = buffBot.getSellItemsBySteamName(sellStateItem.getSteamName()).get(0);
//
//
//
//        }
//
//
//    }
//
//    private void c5Sell(List<SellStateItem> sellStateItems){
//        PackItems c5PackItems = c5Bot.getPack();
//        HashMap<String, PackItem> packItemMap = c5PackItems.getMap();
//        for (SellStateItem sellStateItem : sellStateItems){
//            PackItem packItem = packItemMap.get(sellStateItem.getSteamName());
//            if (packItem == null){
//                logger.error("c5背包中找不到商品："+sellStateItem);
//            }
//            BigDecimal sellPrice = getMinPrice(sellStateItem.getSteamName(), Platform.C5);
//            BigDecimal newPrice = sellPrice.subtract(new BigDecimal("0.01"));
//            if(newPrice.divide(sellStateItem.getBuyPrice()).compareTo(rate.subtract(new BigDecimal("0.05")))>=0){
//                try {
//                    c5Bot.onSell(packItem, newPrice);
//                    SellingMap sellingMap = c5Bot.getOnSell();
//                    SellingItem sellingItem = null;
//                    String goodsId = C5Table.getInstance().getItemInfoBySteamName(sellStateItem.getSteamName()).getId();
//                    // 获取销售id
//                    Iterator<Map.Entry<String, SellingItem>> iterator = sellingMap.entrySet().iterator();
//                    while (iterator.hasNext()){
//                        Map.Entry<String, SellingItem> entry = iterator.next();
//                        if(entry.getValue().getGoodsID().equals(goodsId)){
//                            sellingItem = entry.getValue();
//                            break;
//                        }
//                    }
//                    if(sellingItem != null) {
//                        SellStateTable.getInstance().updateState(sellStateItem.getId(), SellGoodsState.SELLING, newPrice, sellingItem.getSellID());
//                        logger.info(packItem.getSteamName() + "上架成功！");
//                    }
//                    // 上架成功但出售列表找不到商品 (该商品可能被瞬间买下)
//                    else {
//                        logger.info(packItem.getSteamName() + "上架成功，但找不到该商品，开始查找历史记录");
//                        // 可以获取（当前时间-两小时）之后的出售记录
//                        List<SellHistoryItem> sellHistoryItems = c5Bot.getSellHistoryItemsByTime(System.currentTimeMillis());
//                        for(SellHistoryItem sellHistoryItem : sellHistoryItems){
//                            // 如果历史交易信息与出售信息一致，且交易id不存在数据库，则判定被购买
//                            if(sellHistoryItem.getSteamName().equals(sellStateItem.getSteamName())){
//                                SellStateItems sellStateItems1  = SellStateTable.getInstance().getSellStateItemByTradeId(sellHistoryItem.getTradeID());
//                                if(sellStateItems1.size() == 0){
//                                    SellGoodsState sellGoodsState;
//                                    switch (sellHistoryItem.getTradeState()){
//                                        case WAIT:
//                                            sellGoodsState = SellGoodsState.SOLD;
//                                            break;
//                                        case SUCCESS:
//                                            sellGoodsState = SellGoodsState.SUCCESS;
//                                            break;
//                                        case FAIL:
//                                            sellGoodsState = SellGoodsState.C5_PACKAGE;
//                                            break;
//                                        default:
//                                            sellGoodsState = null;
//                                    }
//                                    if (sellGoodsState != null) {
//                                        SellStateTable.getInstance().updateStateTradeId(sellStateItem.getId(), SellGoodsState.SUCCESS, newPrice, sellHistoryItem.getTradeID());
//                                    }
//                                }
//                            }
//                        }
//                    }
//
//                } catch (SellException e) {
//                    logger.error(e);
//                }
//            }
//            else {
//                logger.warn(packItem.getSteamName() + "收益比过低");
//            }
//        }
//    }
//
//    public BigDecimal getMinPrice(String steamName, Platform platform){
//        Bot bot;
//        if(platform == Platform.C5){
//            bot = c5Bot;
//        }
//        else {
//            bot = buffBot;
//        }
//        return bot.getSellItemsBySteamName(steamName).get(0).getPrice();
//    }
//
//    public static void main(String[] args) {
//        AutoSellToRMB astr = new AutoSellToRMB();
//        astr.buffDeliver();
//    }


}
